#ifndef LIST_CYCLE_H_INCLUDED
#define LIST_CYCLE_H_INCLUDED
#include <string>
#include <iostream>

#pragma once

#define status bool
#define OK true
#define ERROR false
#define YES true
#define NO false

using namespace std;

void runCycleList();

template <typename DType>
class Node
{
        public:
                DType data;
                Node * pnext;
};

template <typename DType>
class CCircleLinkList
{
        private:
                Node<DType> *phead;
        public:
                CCircleLinkList();
                ~CCircleLinkList();
        public:
                // 初始化链表
                status InitCList();
                // 获取链表长度
                int GetCListLength();
                // 增加一个节点 前插法
                status AddCListNodeFront(DType idata);
                // 增加一个节点 后插法
                status AddCListNodeBack(DType idata);
                // 判断链表是否为空
                status IsCListEmpty();
                // 获取指定位置节点值（注意，本程序规定0号为节点，e获取删除元素）
                status GetCListIndexNode(DType *e, int index);
                // 删除指定位置节点（e获取删除元素）
                status DeleteCListIndexNode(DType *e, int index);
                // 查找和链表中指定值(pindex获取位置0==>not found)
                status SearchCListNode(DType SData, int *pindex);
                // 指定位置前插
                status InsertCListNodeFront(DType IData, int index);
                //  指定位置后插
                status InsertCListNodeBack(DType IData, int index);
                // 清空链表（保留跟节点）
                status ClearCList();
                // 销毁链表（all delete）
                status DestroyCList();
                // 尾部删除一个元素
                status DeleteCListNohdeBack();
                // 打印链表 此函数根据实际情况而定
                void PrintCList();
};



//循环链表的节点
class ListCycleNode{
	public:
		int tag; //方便打印的时候指导末尾
		string name;
		ListCycleNode* next;

		bool hasNext(){
			return this->next  != NULL;
		}
};








#endif // LIST_CYCLE_H_INCLUDED
